package com.xdb.sqlparser.parser;

import java.util.HashMap;
import java.util.Map;

public class SQLKeywords {

	private final Map<String, SQLToken> keywords;

	public final static SQLKeywords DEFAULT_KEYWORDS;

	static {
		Map<String, SQLToken> map = new HashMap<String, SQLToken>();

		map.put("ALL", SQLToken.ALL);
		map.put("ALTER", SQLToken.ALTER);
		map.put("AND", SQLToken.AND);
		map.put("ANY", SQLToken.ANY);
		map.put("AS", SQLToken.AS);

		map.put("ENABLE", SQLToken.ENABLE);
		map.put("DISABLE", SQLToken.DISABLE);

		map.put("ASC", SQLToken.ASC);
		map.put("BETWEEN", SQLToken.BETWEEN);
		map.put("BY", SQLToken.BY);
		map.put("CASE", SQLToken.CASE);
		map.put("CAST", SQLToken.CAST);

		map.put("CHECK", SQLToken.CHECK);
		map.put("CONSTRAINT", SQLToken.CONSTRAINT);
		map.put("CREATE", SQLToken.CREATE);
		map.put("DATABASE", SQLToken.DATABASE);
		map.put("DEFAULT", SQLToken.DEFAULT);
		map.put("COLUMN", SQLToken.COLUMN);
		map.put("TABLESPACE", SQLToken.TABLESPACE);
		map.put("PROCEDURE", SQLToken.PROCEDURE);
		map.put("FUNCTION", SQLToken.FUNCTION);

		map.put("DELETE", SQLToken.DELETE);
		map.put("DESC", SQLToken.DESC);
		map.put("DISTINCT", SQLToken.DISTINCT);
		map.put("DROP", SQLToken.DROP);
		map.put("ELSE", SQLToken.ELSE);
		map.put("EXPLAIN", SQLToken.EXPLAIN);
		map.put("EXCEPT", SQLToken.EXCEPT);

		map.put("END", SQLToken.END);
		map.put("ESCAPE", SQLToken.ESCAPE);
		map.put("EXISTS", SQLToken.EXISTS);
		map.put("FOR", SQLToken.FOR);
		map.put("FOREIGN", SQLToken.FOREIGN);

		map.put("FROM", SQLToken.FROM);
		map.put("FULL", SQLToken.FULL);
		map.put("GROUP", SQLToken.GROUP);
		map.put("HAVING", SQLToken.HAVING);
		map.put("IN", SQLToken.IN);

		map.put("INDEX", SQLToken.INDEX);
		map.put("INNER", SQLToken.INNER);
		map.put("INSERT", SQLToken.INSERT);
		map.put("INTERSECT", SQLToken.INTERSECT);
		map.put("INTERVAL", SQLToken.INTERVAL);

		map.put("INTO", SQLToken.INTO);
		map.put("IS", SQLToken.IS);
		map.put("JOIN", SQLToken.JOIN);
		map.put("KEY", SQLToken.KEY);
		map.put("LEFT", SQLToken.LEFT);

		map.put("LIKE", SQLToken.LIKE);
		map.put("LOCK", SQLToken.LOCK);
		map.put("MINUS", SQLToken.MINUS);
		map.put("NOT", SQLToken.NOT);

		map.put("NULL", SQLToken.NULL);
		map.put("ON", SQLToken.ON);
		map.put("OR", SQLToken.OR);
		map.put("ORDER", SQLToken.ORDER);
		map.put("OUTER", SQLToken.OUTER);

		map.put("PRIMARY", SQLToken.PRIMARY);
		map.put("REFERENCES", SQLToken.REFERENCES);
		map.put("RIGHT", SQLToken.RIGHT);
		map.put("SCHEMA", SQLToken.SCHEMA);
		map.put("SELECT", SQLToken.SELECT);

		map.put("SET", SQLToken.SET);
		map.put("SOME", SQLToken.SOME);
		map.put("TABLE", SQLToken.TABLE);
		map.put("THEN", SQLToken.THEN);
		map.put("TRUNCATE", SQLToken.TRUNCATE);

		map.put("UNION", SQLToken.UNION);
		map.put("UNIQUE", SQLToken.UNIQUE);
		map.put("UPDATE", SQLToken.UPDATE);
		map.put("VALUES", SQLToken.VALUES);
		map.put("VIEW", SQLToken.VIEW);
		map.put("SEQUENCE", SQLToken.SEQUENCE);
		map.put("TRIGGER", SQLToken.TRIGGER);
		map.put("USER", SQLToken.USER);

		map.put("WHEN", SQLToken.WHEN);
		map.put("WHERE", SQLToken.WHERE);
		map.put("XOR", SQLToken.XOR);

		map.put("OVER", SQLToken.OVER);
		map.put("TO", SQLToken.TO);
		map.put("USE", SQLToken.USE);

		map.put("REPLACE", SQLToken.REPLACE);

		map.put("COMMENT", SQLToken.COMMENT);
		map.put("COMPUTE", SQLToken.COMPUTE);
		map.put("WITH", SQLToken.WITH);
		map.put("GRANT", SQLToken.GRANT);
		map.put("REVOKE", SQLToken.REVOKE);

		DEFAULT_KEYWORDS = new SQLKeywords(map);
	}

	public boolean containsValue(SQLToken token) {
		return this.keywords.containsValue(token);
	}

	public SQLKeywords(Map<String, SQLToken> keywords) {
		this.keywords = keywords;
	}

	public SQLToken getKeyword(String key) {
		key = key.toUpperCase();
		return keywords.get(key);
	}

	public Map<String, SQLToken> getKeywords() {
		return keywords;
	}

}
